Kernel Programming

Kernel Programming
커널 모드에서 수행하는 프로그램을 작성하는 것을 말한다.
- Linux Kernel core 기능 추가
- Linux Kernel 알고리즘 개선
- Linux Kernel 모듈 프로그래밍- 커널 컴파일이 필요 없음
Application Programming & Kernel Programming
    수행방법에서의 차이
Application: 처음부터 순차적으로 수행한다.
Kernel: 응용프로그램이 호출한 system call이나 interrupt handler를 수행하기 위해 비동기적으로 수행한다.
    라이브러리
Application: 모든 라이브러리를 link 하고 사용할 수 있다.
Kernel: kernel에서 export하는 것만 사용할 수 있다.
EXPORT_SYMBOL(func_name)
    커널모드와 사용자 모드
Application: user mode에서 수행되며 하드웨어 직접 접근하는 것과 메모리에 대한 허용되지 않은 접근이 제한된다.
Kernel: kernel mode에서 수행되는 모든 것이 허용된다.
    주소공간(Address Space)
Application Program과 Kernel Program은 서로 다른 메모리 주소 공간을 가진다.
32bit 기준 가상 주소 공간
    Namespace Pollution
Application: 현재 개발하는 프로그램에서만 각 함수의 변수의 이름을 구별해주면 된다.
Kernel: 리눅스 커널=커널 core+다수의 커널 모듈. 현재 개발하는 커널 모듈 뿐만 아니라 커널 전체에서 함수와 변수의 이름이
            충돌하지 않도록 주의해야 한다.
Kenenl Programming 주의 사항
    라이브러리
stdio.h 와 같이 보통 프로그램에서 사용하는 헤더 파일을 사용할 수 없다.
/usr/include/linux와 /usr/include/asm 파일의 라이브리러만 사용할 수 있다.
#include <linux/***.h>
#include <asm/***.h>
    Namespace pollution
외부 파일과 link하지 않을 모든 심볼을 static으로 선언
외부 파일과 link할 symbol을 symbol table에 등록한다.
EXPORT_SYMBOL(name); //symbol name export
전역변수는 잘 정의된 prefix를 붙여준다
ex) sys_open()
    Fault handling
커널은 하드웨어 접근에 대한 어떠한 제한도 없기 때문에 커널에서의 에러는 시스템에 치명적인 결과를 발생시킨다.
함수 호출 등의 작업시 모든 에러 코드를 검사하고 처리해야 한다.
    Address space
커널이 사용하는 스택의 크기는 제한되어 있고, 인터럽트 핸들러도 같은 스택을 사용할 수 있기 때문에 큰 배열을 지역변수로
사용하거나 recursion이 많이 일어나지 않도록 주의해야 한다.
Application과 data를 주고 받기 위해 특별한 함수를 사용해야 한다. call by reference
    기타
실수 연산이나 MMX/SSE 연산(x86)을 사용할 수 없다.